package com.xyx.www;

//////////////////////////class  Person//////////////////////////////////////
class Person{
	// 属性

	private String perName;
	private String perSex;
	private int perAge;
	//行为
	public void eating() {
		System.out.println(this.perName+"吃饭"+this.perSex);
	}
	public void sleeping() {
		System.out.println(this.perName+"睡觉"+this.perSex);
	}
	public static void same() {
		System.out.println("!!!!");
	}
	//有参构造方法
	public Person(String perName, String perSex, int perAge) {
		super();
		this.perName = perName;
		this.perSex = perSex;
		this.perAge = perAge;
		System.out.println("执行了父类Person类的带三个参数的构造方法...");
	}
	//默认无参构造方法
	public Person() {		
		System.out.println("执行了父类Person类的默认的构造方法...");
	}
	
	//get set入口
	public String getPerName() {
		return perName;
	}

	public void setPerName(String perName) {
		this.perName = perName;
	}

	public String getPerSex() {
		return perSex;
	}

	public void setPerSex(String perSex) {
		this.perSex = perSex;
	}

	public int getPerAge() {
		return perAge;
	}

	public void setPerAge(int perAge) {
		this.perAge = perAge;
	}
	public void  set() {
		System.out.println("super指代调用父类中的成员变量和方法");
	}
}
//////////////////////////class  Student01//////////////////////////////////////
class Student01 extends Person{
	// 属性
	private String stuNo;

	//行为
	public void studing() {
		System.out.println(this.getPerName()+"正在学习");
	}
	public void running() {
		System.out.println(getPerName()+"正在跑步");
	}
	public String getPerName(){
		String arr= "sssss";
		return arr;
	}
	public static void same() {
		System.out.println("!!!son");
	}
	
	//有参构造方法
	public Student01(String stuNo) {
		this.stuNo = stuNo;
		System.out.println("执行了子类Student的带一个参数的构造方法....");
	}
	// 无参构造方法
	public Student01() {
		System.out.println("执行了子类Student的默认构造方法....");
	}
	public void  set() {
		System.out.println("this指代调用本类中的成员变量和方法");
	}
	//带四个参数的构造方法
	public Student01(String perName, String perSex, int perAge, String stuNo) {
		// 通过调用父类的构造方法，来初始化子类无法继承到的父类的私有属性
		super(perName, perSex, perAge);
		// 通过调用从父类继承到的set方法接口，来初始化子类无法继承到父类的私有属性
		 //this.setPerName(perName);
		// this.setPerSex(perSex);
		// this.setPerAge(perAge);
		this.set();
		super.set();
		//给本类子类的特有属性赋值
		this.stuNo = stuNo;
		System.out.println("执行了子类Student的带四个参数的构造方法....");
	}
	//get set 入口
	public String getStuNo() {
		return stuNo;
	}

	public void setStuNo(String stuNo) {
		this.stuNo = stuNo;
	}
	
}
class Teacher extends Person{
	
}
//////////////////////////class  Test0727//////////////////////////////////////

class Test0727 {
	public static void main(String[] args) {
		test02();
		test03();
	}
	/**
	 * 继承中的构造方法的使用
	 */
	private static void test02() {
		// 创建Student类的实例对象
		Student01 stu = new Student01("小明","男",24,"15001");
		// 调用行为
		stu.eating();
		stu.running();
		
	}
	/**
	 * 继承的使用
	 */
	private static void test01() {
		// 创建Student类的实例对象
		Student01 stu = new Student01();
		// set方法设值私有属性
		stu.setPerName("小明");
		// 调用行为
		stu.studing();
		/*向上溯型
		父类指向子类*/
		Person per=new Student01();
		
	}
	
	/**
	 * instanceof关键字
	 */
	private static void test04() {
		// 父类变量指向子类引用
		Person per0 = new Student01();
		Student01 stu0 = (Student01) per0;
		// 创建一个person类型的变量
		//一个对象类型的变量是该类以及该类的所有的直接或间接父类的类型。
		//以下结果皆为true
		Teacher tea0 = new Teacher();
		System.out.println("per0是不是Person类型：" + (per0 instanceof Person));

		boolean isOk1 = stu0 instanceof Person;
		System.out.println("stu0是不是Person类型：" + isOk1);

		System.out.println("per0是不是Student类型：" + (per0 instanceof Student01));

		System.out.println("per0是不是Object类型：" + (per0 instanceof Object));
		System.out.println("stu0是不是Object类型：" + (stu0 instanceof Object));

		System.out.println("tea0是不是Person类型：" + (tea0 instanceof Person));
		//Teacher 实例出来的对象tea0并不是Student01的类型编译不通过，报错
		 //System.out.println("tea0是不是Student类型：" + (tea0 instanceof Student01));
		
		String  str = "小明";
		if(str.equals("小明")){
			System.out.println("俺就是小明。。。");
		}
	}
	/**
	 * 多态：向下溯型
	 */
	private static void test03() {
		// 父类变量指向子类引用，父类类型变量指向子类类型
		Person per0 = new Student01();
		// 不能调用子类新扩展的行为方法
		// per0.doStuding();
		// 将父类类型重新转换为子类类型
		Student01 stu0 = (Student01)per0; // 向下溯型【强制转换】
		stu0.studing();

		//////////本身为Person声明的实例不能向下溯型//////////
		Person per1 = new Person();
//////////////////本身为Person声明的实例per1不能向下溯型,报异常////////////////
		//Student01 stu1 = (Student01) per1;
		// 调用student01类的行为方法
		//stu1.studing();
	}
}
